#ifndef _INC_FACULTY_T_H
#define _INC_FACULTY_T_H

#include <set>
#include <string>

class Student_t;

class Faculty_t
{
public:
	/**
	* Ctor
	*/
	Faculty_t(const std::string& name);

	/**
	* Dtor
	*/
	virtual ~Faculty_t();

	/**
	* Returns faculty name
	*/
	inline const std::string& name() const {
		return m_name;
	}

	/**
	* Creates a new student and adds him to faculty
	* [Template Method]
	*/
	Student_t* makeStudent();

	/**
	* Notifies on price raised
	*/
	virtual void notifyPriceRaised() const;

	/**
	* Notifies on lecture canceled
	*/
	virtual void notifyLectureCanceled() const;

protected:
	/**
	* Creates a new student
	* [Factory Method]
	*/
	virtual Student_t* doMakeStudent() const = 0;

	typedef std::set<Student_t*> StudentContainer;
	StudentContainer m_students;

private:
	/**
	* Copy Ctor - no impl
	*/
	Faculty_t(const Faculty_t& other);

	/**
	* Operator= - no impl
	*/
	Faculty_t& operator=(const Faculty_t& other);

	std::string m_name;
};

#endif // _INC_FACULTY_T_H